﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>WinGet</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>WinGet</h1>

<p>返回符合指定条件的窗口的 uID，进程ID，进程名称，或控件列表。它也可以返回一个列表，包含所有符合指定条件的窗口。</p>

<p class="CommandSyntax">WinGet, OutputVar [, Cmd, WinTitle, WinText, ExcludeTitle, ExcludeText]</p>
<h3>参数 </h3>
<table border="1" width="100%" cellspacing="0" cellpadding="3" bordercolor="#C0C0C0">
  <tr>
    <td width="15%">OutputVar</td>
    <td width="85%">输出变量，存储由 <em>Cmd</em> 指定的结果。</td>
  </tr>
  <tr>
    <td>Cmd</td>
    <td>查看下面的说明。
    </td>
  </tr>
  <tr>
    <td>WinTitle</td>
    <td>目标窗口的标题或标题中的部分文字（匹配模式由 <a href="SetTitleMatchMode.htm">SetTitleMatchMode</a> 决定）。如果省略下面 3 个参数，默认目标是 <a href="../LastFoundWindow.htm">上一次匹配的窗口</a> 。要用窗口的 class 名进行匹配，使用 <em>ahk_class 精确 class 名</em>（Window Spy 中可以显示 class 名）。要用窗口的 <a href="Process.htm">进程标识符（PID）</a>进行匹配，使用 <em>ahk_pid %PID变量%</em> 。要用窗口的 <a href="WinGet.htm">唯一 ID</a> 进行匹配，使用 <em>ahk_id %ID变量%</em> 。要减小检测范围，使用 <a href="../LastFoundWindow.htm#multi">多重条件</a> ，例如：<em>My File.txt ahk_pid %ID变量%</em></td>
  </tr>
  <tr>
    <td>WinText</td>
    <td>如果使用这个参数，则它应该是目标窗口中某个文本元素的子字符串（在 Window Spy 中会显示出窗口中的文本元素）。隐藏文本只有在 <a href="DetectHiddenText.htm">DetectHiddenText</a> 设置为 ON 的时候才能检测到。</td>
  </tr>
  <tr>
    <td>ExcludeTitle</td>
    <td>标题中包含该参数指定的文字的窗口将被除外。</td>
  </tr>
  <tr>
    <td>ExcludeText</td>
    <td>文本元素中包含该参数指定的文字的窗口将被除外。</td>
  </tr>
</table>

<p><em>Cmd</em> 指定了返回值的内容，如果留空，默认是 <em>ID</em> 。它可以是下面单词的其中之一：</p>
<p><strong><a name="ID"></a>ID</strong>：返回窗口的 uID（HWND/句柄）。如果没有匹配窗口，<em>OutputVar</em> 为空。函数 <a href="IfWinExist.htm">WinExist()</a> 和 <a href="IfWinActive.htm">WinActive()</a> 也可以用来获取窗口的 uID ，例如，WinExist(&quot;A&quot;) 能快速获取当前激活窗口的 uID 。要获取一个控件的 HWND（供 <a href="PostMessage.htm">Post/SendMessage</a> 或 <a href="DllCall.htm">DllCall</a> 使用），使用 <a href="ControlGet.htm#Hwnd">ControlGet Hwnd</a> 或 <a href="MouseGetPos.htm">MouseGetPos</a> 。</p>
<p><strong>IDLast</strong>：和上面的功能一样，不过当匹配的窗口超过一个的时候，它返回的是 最底端/最后使用 的窗口的 ID。如果只有一个匹配窗口，它和 <em>ID</em> 的效果一样。类似的概念也适用于 <a href="WinActivateBottom.htm">WinActivateBottom</a> 。</p>
<p><strong>PID</strong>：返回窗口的 <a href="Process.htm">进程ID（PID）</a>。</p>
<p><strong>ProcessName</strong>：返回窗口所属进程的进程名称（例如 notepad.exe）。如果没有匹配窗口，<em>OutputVar</em> 为空。</p>
<p><strong>Count</strong>：返回符合 <em>WinTitle</em> ，<em>WinText</em> ，<em>ExcludeTitle</em> 以及 <em>ExcludeText</em> 所指定的条件的窗口数量（如果没有匹配窗口则返回 0 ）。要统计当前总窗口数，省略所有和 标题/文本 有关的参数。默认不统计隐藏窗口，除非打开了 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 。</p>
<p><strong><a name="List"></a>List</strong>：返回所有符合 <em>WinTitle</em> ，<em>WinText</em> ，<em>ExcludeTitle</em> 以及 <em>ExcludeText</em> 所指定的条件的窗口的 uID （要返回当前所有窗口的 uID ，省略所有和 标题/文本 有关的参数）。每个 ID 由一个 <a href="../misc/Arrays.htm">数组元素</a> 存储，数组元素名从 <em>OutputVar</em> 开始，而 <em>OutputVar</em> 本身则存储了数组的长度（如果没有匹配窗口则为 0 ）。例如，<em>OutputVar</em> 使用 MyArray ，有 2 个匹配窗口，则变量 MyArray1 存储了第一个窗口的 ID ，变量 MyArray2 存储了第二个窗口的 ID ，而变量 MyArray 存储了数组长度 2 。窗口 ID 的返回顺序是从最顶端的窗口到最底端的窗口（取决于它们在桌面上的堆放方式）。默认不返回隐藏窗口的 ID ，除非打开了 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 。在一个 <a href="../Functions.htm">函数</a> 中，要创建一个全局数组，在使用这个命令之前 <a href="../Functions.htm#Global">声明</a> MyArray 为全局变量（在使用了 <a href="../Functions.htm#AssumeGlobal">assume-global</a> 的函数中则是相反的情况）。</p>
<p><strong>MinMax</strong>：返回窗口的 最小化/最大化 状态。如果没有匹配窗口，<em>OuputVar</em> 为空，否则，返回下列数值之一：<br>
  -1：窗口处于最小化状态（ <a href="WinRestore.htm">WinRestore</a> 可以还原它）。<br>
  1：窗口处于最大化状态（ <a href="WinRestore.htm">WinRestore</a> 可以还原它）。<br>
  0：窗口既不处于最大化也不处于最小化状态。</p>
<p><strong><a name="ControlList"></a>ControlList</strong>：返回一个列表，包含窗口中所有控件的名称。如果没有匹配窗口或窗口中没有控件，<em>OutputVar</em> 为空。否则，每个控件的名称由它的 class 名和序号（ClassNN）组成，同 Window Spy 中显示的一样。</p>
<p>除了最后一个控件的名称之外，每个名称后都跟着一个换行符（`n）。要单独遍历所有的控件名称，使用 <a href="LoopParse.htm">parsing loop</a> ，可以参考最下面示例区中的例子。</p>
<p>控件名称的存储顺序取决于它们的 Z 轴顺序，如果窗口支持 Tab 导航，这个顺序一般和 Tab 顺序一样。</p>
<p>要返回鼠标当前所指控件的信息，使用 <a href="MouseGetPos.htm">MouseGetPos</a> 。</p>
<p><strong>ControlListHwnd</strong> [v1.0.43.06+]：功能同上，不同的是它返回的是控件的 <a href="ControlGet.htm#Hwnd">窗口句柄（HWND）</a>。</p>
<p><strong>Transparent</strong>：返回窗口的透明度（用 <a href="WinSet.htm">WinSet</a> 设置窗口透明）。<em>OutputVar</em> 在以下情况时为空：1、系统比 Windows XP 老；2、没有匹配窗口；3、窗口没有设置透明；4、其它情况（由系统行为引起），例如窗口透明后被最小化，还原，以及/或者调整大小。否则，<em>OutputVar</em> 存储一个 0 到 255 之间的值，0 表示完全透明，255 表示不透明。例如：</p>
<pre>MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%  <em>; 获取鼠标当前所指窗口的透明度。</em></pre>
<p><strong>TransColor</strong>：返回窗口的透明色（用 <a href="WinSet.htm#TransColor">WinSet</a> 设置透明色）。<em>OutputVar</em> 在以下情况时为空：1、系统比 Windows XP 老；2、没有匹配窗口；3、窗口没有设置透明色；4、其它情况（由系统行为引起），例如窗口透明后被最小化，还原，以及/或者调整大小。否则，<em>OutputVar</em> 存储一个 6 位的十六进制数，表示 RGB 颜色，比如 0x00CC99 。例如：</p>
<pre>MouseGetPos,,, MouseWin
WinGet, TransColor, TransColor, ahk_id %MouseWin%  <em>; 获取鼠标当前所指窗口的透明色。</em></pre>
<p><strong>Style</strong> 或 <strong>ExStyle</strong>：返回一个 8 位的十六进制数，表示窗口的样式或扩展样式。如果没有匹配窗口，<em>OutputVar</em> 为空。下面这个例子检测一个窗口是否具有 WS_DISABLED 样式：</p>
<pre>WinGet, Style, Style, My Window Title
if (Style &amp; 0x8000000)  <em>; 0x8000000 表示 WS_DISABLED 。</em>
  ... 检测到窗口为不可用状态，进行适当的操作。</pre>
<p>下面的例子检测一个窗口是否具有 WS_EX_TOPMOST 样式（置顶）：</p>
<pre>WinGet, ExStyle, ExStyle, My Window Title
if (ExStyle &amp; 0x8)  <em>; 0x8 表示 WS_EX_TOPMOST.</em>
  ... 检测到窗口处于置顶状态，进行适当的操作。</pre>
<p>更多样式，查看 <a href="../misc/Styles.htm">样式列表</a> 。</p>
<h3>注意</h3>
<p>窗口的 ID 只在窗口的生命周期中有效。也就是说，一个程序重启之后，它所有的窗口都将使用新的 ID 。</p>
<p>这个命令获取的 ID 仅是一个数字（不包括前缀“ahk_id”），并且以十六进制存储，与 <a href="SetFormat.htm">SetFormat</a> 的设置无关。</p>
<p>要获取鼠标当前所指窗口的 ID ，使用 <a href="MouseGetPos.htm">MouseGetPos</a> 。</p>
<p>虽然目前获取的 ID 是 32 位的无符号整数，但是将来的版本中可能会变成 64 位的。因此，对这些值进行数学操作，例如相加，是不安全的。因为这些操作要求操作数是有正负号的整数而不是无符号的整数。</p>
<p>窗口的标题和窗口中的文字是大小写敏感的。要检测隐藏窗口，必须打开 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 。</p>
<h3>相关命令</h3>
<p><a href="WinGetClass.htm">WinGetClass</a>, <a href="Process.htm">Process</a>, <a href="WinGetTitle.htm">WinGetTitle</a>, <a href="MouseGetPos.htm">MouseGetPos</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="ControlFocus.htm">ControlFocus</a>, <a href="GroupAdd.htm">GroupAdd</a></p>
<h3>示例</h3>
<pre class="NoIndent"><em>; 示例 #1：最大化当前激活窗口并且显示它的 uID 。</em>
WinGet, active_id, ID, A
WinMaximize, ahk_id %active_id%
MsgBox, The active window's ID is &quot;%active_id%&quot;.

<em>; 示例 #2：访问当前所有窗口并且分别显示它们的信息。</em>
WinGet, id, list,,, Program Manager
Loop, %id%
{
    this_id := id%A_Index%
    WinActivate, ahk_id %this_id%
    WinGetClass, this_class, ahk_id %this_id%
    WinGetTitle, this_title, ahk_id %this_id%
    MsgBox, 4, , Visiting All Windows`n%a_index% of %id%`nahk_id %this_id%`nahk_class %this_class%`n%this_title%`n`nContinue?
    IfMsgBox, NO, break
}

<em>; 示例 #3：从控件列表中分离出每个单独的控件名称。</em>
WinGet, ActiveControlList, ControlList, A
Loop, Parse, ActiveControlList, `n
{
    MsgBox, 4,, Control #%a_index% is &quot;%A_LoopField%&quot;. Continue?
    IfMsgBox, No
        break
}

<em>; 示例 #4：实时显示当前激活窗口的控件列表。</em>
#Persistent
SetTimer, WatchActiveWindow, 200
return
WatchActiveWindow:
WinGet, ControlList, ControlList, A
ToolTip, %ControlList%
return</pre>

</body>
</html>
